//消消乐
// function play(key,time,callback){
//     setTimeout(() => {
//         key++; //2
//         callback(key)
//     },time)
// }

//回调地狱
// play(1,1000,(two) => {
//     console.log("第二关的钥匙",two);
//     play(two,2000,(three) => {
//         console.log("第三关的钥匙",three);
//         play(three,3000,(four) => {
//             console.log("第四关的钥匙",four);   
//             //.... 
//         })
//     });
// });

//Promise  密闭的容器，里面放着未来才会发生的事件   



/**
 * 
 * //构造函数let p1 =  new Promise((resolve,reject) => {


// })
 * 
 * .then((data)=>{成功状态会触发},(error)=>{失败状态会触发})
 * 
 * .catch(() => {})  失败的状态会触发函数
 * 
 * .finally(() => {}) 不管成功还是失败都会触发的函数
 * 
 * 1.三个状态：进行中 pending  已成功 fulfilled   已失败 rejected
 * 
 * 2.特点：
 * 
 *      1>状态一旦发生改变就不会再变   进行中 ---> 已成功 resolve()  进行中--->已失败 reject()
 * 
 *      2>状态改变不受外界的影响
 * 
*/


function play(key,time){
    return new Promise((resolve,reject) => {
        setTimeout(() => {
            key++; //2
            resolve(key)
        },time)
    })
}

// // play(1,1000).then(res => {

// // }).catch(error => {
// //     console.log(error)
// // }).finally(() => {
// //     console.log("=====")
// // })

// play(1,1000).then((two) => {
//     console.log(two)
//     return play(two,2000)
// }).then(three => {
//     console.log(three);
//     return play(three,2000)
// }).then(four => {
//     console.log(four);
//     // return play(four,2000) ....
// })


//async await ES7 引进的解决异步编程的方案

/**
 *              调用方式      返回值不一致
 * 
 * async 函数     run()        promise对象
 * 
 * 普通函数       run()        return 值
 * 
*/

async function run(){
    let two = await play(1,1000);
    console.log(two)
    let three = await play(two,2000);
    console.log(three)
    let four = await play(three,2000);
    console.log(four);
}

console.log(run());

// run().then(res => {
//     console.log(res)
// })

// =================================================================

//切菜

// function cut(){
//     return new Promise((resolve,reject) => {
//         setTimeout(() => {
//             reject("切菜失败")
//         },2000)
//     })
// }

// //烧水

// function water1(){
//     return new Promise((resolve,reject) => {
//         setTimeout(() => {
//             resolve("用电烧水完成")
//         },500)
//     })
// }

// function water2(){
//     return new Promise((resolve,reject) => {
//         setTimeout(() => {
//             resolve("用煤气烧水完成")
//         },1000)
//     })
// }

// //Promise.all([p1,p2,....]).then()  所有都完成才算完成
// //场景
// // Promise.all([cut(),water()]).then(res => {
// //     console.log("准备工作完成",res);
// // }).catch(error => {
// //     console.log(error)
// // })

// //Promise.race([p1,p2,...]) 只要有一个完成，就算完成
// Promise.race([water1(),water2()]).then(res => {
//     console.log(res);
// })